package pattern.singleton.lazy;

import sun.security.jca.GetInstance;

/**
 * 懒汉式单例 内部类实现
 * 这种形式既兼顾饿汉式的内存浪费，也兼顾synchronized的性能问题
 * 完美屏蔽了这两个缺点
 * 史上最牛B单例模式实现方式
 * @author: jxj
 * @create: 2019-04-22
 **/
public class LazyInnerClassSingleton {
    //默认使用LazyInnerClassSingleton会先初始化内部类
    //如果没使用的话，内部类是不加载的
    private LazyInnerClassSingleton(){
        //这里添加了判断不为null抛异常，主要是为了防止通过反射强吻的方式创建多个实例
        if(null!=LazyHolder.LAZY){
            throw new RuntimeException("不允许创建多个实例！");
        }
    }

    //每一个关键字都是必要的
    //static 是为了使单例的空间共享
    //final 是为了不被重写
    public static final LazyInnerClassSingleton GetInstance(){
        //在返回结果前，一定会先加载内部类
        return LazyHolder.LAZY;
    }

    //默认不加载
    private static class LazyHolder{
        private static final LazyInnerClassSingleton LAZY=new LazyInnerClassSingleton();
    }
}
